using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using AccesoDatos;
using Entidades;
using System.Data.SqlClient;

namespace Negocio.Negocio
{
    // Clase de negocio
    internal class VentaAlojamiento
    {
        #region Metodos publicos

        // Lista la cabecera de la venta de alojamiento
        public DataTable ListaServicioExtraAsignado(int codigoVenta)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();
                Object[,] parmSP = { 
                    {"@codigoVenta", SqlDbType.Int, 4, codigoVenta}
                };
                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_ServicioExtraAsignado", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("ListaServicioExtraAsignado() - " + ex.Message);
            }
        }

        // Lista la cabecera de la venta de alojamiento
        public DataTable ListaVentaAlojamiento(int codigoVenta)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();
                Object[,] parmSP = { 
                    {"@codigoVenta", SqlDbType.Int, 4, codigoVenta}
                };
                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_VentaAlojVtaCliente", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("ListaVentaAlojamiento() - " + ex.Message);
            }
        }

        // Lista la venta de alojamiento de habitaciones
        public DataTable ListaVentaAlojamientoHabitacion(int codigoVenta)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();
                Object[,] parmSP = { 
                    {"@codigoVenta", SqlDbType.Int, 4, codigoVenta}
                };
                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_VentaAloj", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("ListaVentaAlojamiento() - " + ex.Message);
            }
        }

        // Lista las ventas de alojamiento para el administrador
        public DataTable ListaVentaAlojamiento(int codigoCliente, String fechaInicio, String fechaFin, String estadoVenta)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();
                Object[,] parmSP = { 
                    {"@codigoCliente", SqlDbType.Int, 4, codigoCliente},
                    {"@dfechaInicio", SqlDbType.Char, 8, fechaInicio}, 
                    {"@dfechaFin", SqlDbType.Char, 8, fechaFin},
                    {"@estadoVenta", SqlDbType.Char , 1, estadoVenta}
                };
                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_VentaAlojamiento", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("ListaVentaAlojamiento() - " + ex.Message);
            }
        }

        // Inserta una venta de alojamiento
        public DataTable InsertaVtaAlojamiento(int CantidadHabitacion, String FechaLlegada,
            String HoraLlegada, String FechaSalida, String HoraSalida, String NumeroReserva,
            int CodigoVenta, int TipoHabitacion)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                {"@CantidadHabitacion", SqlDbType.Int, 6, CantidadHabitacion},
                {"@FechaLlegada", SqlDbType.Char, 8, FechaLlegada},
                {"@HoraLlegada", SqlDbType.Char, 8, HoraLlegada},
                {"@FechaSalida", SqlDbType.Char, 8, FechaSalida},
                {"@HoraSalida", SqlDbType.Char, 8, HoraSalida},
                {"@NumeroReserva", SqlDbType.VarChar, 20, NumeroReserva},
                {"@CodigoVenta", SqlDbType.Int, 4, CodigoVenta},
                {"@TipoHabitacion", SqlDbType.Int, 4, TipoHabitacion},
                };

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_INS_VentaAlojamiento", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("insertaVtaAlojamiento() - " + ex.Message);
            }
        }

        public DataTable MontoPorHabitacion(int codigoTipoHabitacion)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                        {"@codTipoHabitacion", SqlDbType.Int, 4, codigoTipoHabitacion}
                };
                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_MontoHabitacion", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("montoPorHabitacion- " + ex.Message);
            }
        }

        public void VerificarDisponibilidadServicio()
        {
        }

        public void CrearVenta()
        {
        }

        public void ObtenerTiposHabitacion()
        {
        }

        // Inserta la venta de alojamiento
        public bool InsertaVtaAlojamiento(Entidades.Venta vta, Entidades.VentaAlojamiento[] vtaAloj, Entidades.VentaAlojamientoDetalle[] vtaServAdic)
        {
            try
            {
                // Inicializa los valores por defecto de la venta
                vta.TipoVenta = 1; // Alojamiento
                vta.TipoPago = 1; // Con tarjeta
                vta.TipoTarjetaCredito = 2; // Credito

                Negocio.RutinasGenericas rutGen = new Negocio.RutinasGenericas();

                // Obtiene la informacion adicional del cliente
                Cliente oCliente = new Cliente();
                DataTable dtInfoCliente = oCliente.ListaCliente("-1", "", "", "", "", "", vta.CodigoCliente.ToString());
                if (rutGen.DtValido(dtInfoCliente))
                {
                    vta.TarjetaCredito = (string)dtInfoCliente.Rows[0]["tTarjetaDeCredito"];
                }

                // Inserta la cabecera de la venta de alojamiento
                Venta oVenta = new Venta();
                DataTable dtInfoVenta = oVenta.InsertaVenta(vta.FechaVenta, vta.PersonaContacto, vta.SubTotal,
                    vta.Impuesto, vta.Total, vta.EstadoAprobacion.ToString(), vta.CodigoVendedor, vta.CodigoCliente,
                    vta.CodigoPromocion, vta.TipoVenta, vta.TipoPago, vta.TipoTarjetaCredito, vta.TarjetaCredito,
                    vta.CodigoProgFidelizacion, vta.MontoPromocion, vta.MontoDescuento);

                // En caso se haya insertado la cabecera de la venta de alojamiento prosigue
                if (rutGen.DtValido(dtInfoVenta))
                {
                    // Inserta cada alojamiento
                    for (int cantReg = 0; cantReg < vtaAloj.Length; cantReg++)
                    {
                        // Inserta el alojamiento
                        vtaAloj[cantReg].CodigoVenta = Convert.ToInt32(dtInfoVenta.Rows[0]["CodigoVenta"].ToString());
                        DataTable dtInfoAlojamiento = InsertaVtaAlojamiento(vtaAloj[cantReg].CantidadHabitacion,
                            vtaAloj[cantReg].FechaLlegada, vtaAloj[cantReg].HoraLlegada, vtaAloj[cantReg].FechaSalida,
                            vtaAloj[cantReg].HoraSalida, vtaAloj[cantReg].NumeroReserva, vtaAloj[cantReg].CodigoVenta,
                            vtaAloj[cantReg].TipoHabitacion);

                        // En caso no se haya insertado el alojamiento
                        if (!rutGen.DtValido(dtInfoAlojamiento))
                        {
                            return false;
                        }
                    }

                    // Inserta cada servicio adicional
                    VentaServiciosAdicionales oVtaServAdic = new VentaServiciosAdicionales();
                    for (int cantReg = 0; cantReg < vtaServAdic.Length; cantReg++)
                    {
                        // Inserta el servicio adicional
                        vtaServAdic[cantReg].VtaAlojamientoID = Convert.ToInt32(dtInfoVenta.Rows[0]["CodigoVenta"].ToString());
                        DataTable dtInfoServAdic = oVtaServAdic.insertaVtaServExtras(vtaServAdic[cantReg].Item,
                            vtaServAdic[cantReg].MontoServicio, vtaServAdic[cantReg].DescripcionAdicional,
                            vtaServAdic[cantReg].VtaAlojamientoID, vtaServAdic[cantReg].CodigoServicioExtra,
                            0, 0);

                        // En caso no se haya insertado el servicio adicional
                        if (!rutGen.DtValido(dtInfoServAdic))
                        {
                            return false;
                        }
                    }
                }
                else
                {
                    return false;
                }

                // Si todo esta ok
                return true;
            }
            catch (Exception ex)
            {
                throw new Exception("InsertaVtaAlojamiento() - " + ex.Message);
            }
        }

        // Elimina (anula) la venta de alojamiento
        public bool EliminaVtaAlojamiento(Entidades.Venta vta)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                {"@CodigoVenta", SqlDbType.Int, 4, vta.CodigoVenta},
                };

                int rpta = (int)(oSql.ExecSPReturnEscalar(oRutGen.CadenaConexion(), "UP_VTA_DEL_Venta", parmSP));
                if (rpta > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("EliminaVtaAlojamiento() - " + ex.Message);
            }
        }

        #endregion
    }
}
